package com.ikun.util;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.FileUploadException;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;
import org.apache.commons.io.IOUtils;

public class UploadUtil {

    public static String uploadPic(HttpServletRequest request, HttpServletResponse response)throws Exception {
        String result = null;
        try {
            //使用apache的commons-IO-1.4.jar包进行文件的上传操作，IOUtils.copy(in,out);
            //设置一个缓存，将大的文件使用缓存成临时文件再保存成完整文件

            //1、创建磁盘文件项工厂
            //作用：设置缓存文件的大小，设置临时文件存储的位置

            //设置临时文件存储的位置
            String path_temp = request.getServletContext().getRealPath("temp");

            //判断存储临时文件的路径是否存在
            if (!new File(path_temp).exists()) {
                //不存在的情况，就创建该路径
                new File(path_temp).mkdirs();
                System.out.println("该缓存路径不存在，自动创建该路径...");
            }

            //设置临时文件的大小和将临时文件存储到指定的位置中（两种方法）
            //1、直接设置在构造方法中
            //DiskFileItemFactory factory=new DiskFileItemFactory(1024*1024,new File(path_temp));
            //2、通过工厂的方法单独设置大小和指定位置
            DiskFileItemFactory factory = new DiskFileItemFactory();
            //设置临时文件的大小
            factory.setSizeThreshold(1024 * 1024);
            //设置临时文件存储的位置
            factory.setRepository(new File(path_temp));

            //2、创建文件上传的核心类
            ServletFileUpload upload = new ServletFileUpload(factory);

            //设置上传文件的名称的编码格式
            upload.setHeaderEncoding("UTF-8");

            //ServletFileUpload的API
            //通过isMultipartContent方法判断表单是否是文件上传的表单返回bool是为true，不是为false

            boolean multipartContent = upload.isMultipartContent(request);

            if (multipartContent) {
                //是文件上传的表单
                //解析request获得文件项的集合
                //获得表单中所有的表单数据
                List<FileItem> parseRequest = upload.parseRequest(request);
                //判断表单数据是否为null
                if (parseRequest != null) {
                    //表单数据不为空，将表单数据遍历出来
                    for (FileItem fileItem : parseRequest) {
                        //将遍历后的表单数据一一进行判断，将文件表单数据和普通表单数据分开处理
                        //判断是否是一个普通表单数据，使用isFormField()方法。是一个普通表单数据为true
                        boolean formField = fileItem.isFormField();

                        if (formField) {
                            //普通表单数据

                            /*
                             * 如果是一个普通表单项的时候，这个时候request的getParameter等方法就失效了。
                             * 只能通过下述的方法来获取数据的name和value值
                             */

                            //通过方法getFieldName()获得到普通表单项的name
                            String filedName = fileItem.getFieldName();
                            //通过方法getString()获得到普通表单项的value,并且将编码格式设置为UTF-8
                            String filedValue = fileItem.getString("UTF-8");

                            System.out.println("filename=" + filedName);
                            System.out.println("filevalue=" + filedValue);
                        } else {
                            //文件上传表单数据
                            //首先获得上传文件的名称
                            String fileName = fileItem.getName();
                            String[] aa = fileName.split("\\\\");
                            String name = aa[aa.length - 1];
                            System.out.println(name);
                            //获得上传文件的内容,通过输入流进行文件内容读取
                            InputStream in = fileItem.getInputStream();

                            //指定上传文件保存的路径
                            String path_store = request.getServletContext().getRealPath("pic");

                            //判断指定的文件保存路径是否存在，不存在的话就创建
                            if (!new File(path_store).exists()) {
                                new File(path_store).mkdirs();
                                System.out.println("保存文件的路径不存在，自动创建该路径...");
                            }

                            //自定义文件的名称，防止文件上传后出现重名覆盖
                            fileName = new SimpleDateFormat("yyyyMMddhhmmss").format(new Date()) + " " + name;
                            System.out.println("filename=" + fileName);
                            //通过输出流将文件保存的路径及名称指定和保存
                            System.out.println("路径：" + path_store + "\\" + fileName);
                            OutputStream out = new FileOutputStream(path_store + "\\" + fileName);

                            //通过apache的工具类中的IOUtils中的一个方法copy将文件内容从输入流中复制到输出流中
                            IOUtils.copy(in, out);

                            result = "pic/"+fileName;

                            //关流
                            in.close();
                            out.close();

                            //删除临时文件
                            fileItem.delete();
                        }
                    }
                }
            } else {
                //不是文件上传的表单
                //使用常规的servlet获取数据的方法
                String username = request.getParameter("username");
            }

        } catch (FileUploadException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        return result;
    }

}
